package com.example.ftp;

import android.os.Environment;

import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
import org.apache.ftpserver.ftplet.FtpFile;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;

import static com.example.ftp.DebugLog.LOG;

/**
 * Created Date 2019/7/22
 *
 * @author liangkun
 * description：
 */
public class FTPUtils {

    private FTPClient ftpClient = null;
    private static FTPUtils ftpUtilsInstance = null;
    private String FTPUrl;
    private int FTPPort;
    private String UserName;
    private String UserPassword;

    private FTPUtils() {
        ftpClient = new FTPClient();
    }

    /*
     * 得到类对象实例（因为只能有一个这样的类对象，所以用单例模式）
     */
    public static FTPUtils getInstance() {
        if (ftpUtilsInstance == null) {
            ftpUtilsInstance = new FTPUtils();
        }
        return ftpUtilsInstance;
    }

    /**
     * 设置FTP服务器
     *
     * @param FTPUrl       FTP服务器ip地址
     * @param FTPPort      FTP服务器端口号
     * @param UserName     登陆FTP服务器的账号
     * @param UserPassword 登陆FTP服务器的密码
     * @return
     */
    public boolean initFTPSetting(String FTPUrl, int FTPPort, String UserName,
                                  String UserPassword) {
        this.FTPUrl = FTPUrl;
        this.FTPPort = FTPPort;
        this.UserName = UserName;
        this.UserPassword = UserPassword;

        int reply;

        try {
            // 1.要连接的FTP服务器Url,Port
            ftpClient.connect(FTPUrl, FTPPort);

            // 2.登陆FTP服务器
            ftpClient.login(UserName, UserPassword);

            // 3.看返回的值是不是230，如果是，表示登陆成功
            reply = ftpClient.getReplyCode();

            if (!FTPReply.isPositiveCompletion(reply)) {
                // 断开
                ftpClient.disconnect();
                return false;
            }
            DebugLog.d(LOG + "登陆成功");
//            listFiles("ftp://192.168.31.148:9007/");
            return true;

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 上传文件
     *
     * @param FilePath 要上传文件所在SDCard的路径
     * @param FileName 要上传的文件的文件名(如：Sim唯一标识码)
     * @return true为成功，false为失败
     */
    public boolean uploadFile(String FilePath, String FileName) {
        if (!ftpClient.isConnected()) {
            return false;
        }
        if (!initFTPSetting(FTPUrl, FTPPort, UserName, UserPassword)) {
            return false;
        }
        try {
            // 设置存储路径
            ftpClient.setControlEncoding("UTF-8");
            ftpClient.enterLocalPassiveMode();
            ftpClient.setDefaultTimeout(600000);
            ftpClient.setDataTimeout(600000);
//            boolean isCreat = ftpClient.makeDirectory("/sdcard");
//            DebugLog.d(LOG+ "isCreat---- "+isCreat);
//            ftpClient.changeWorkingDirectory("/sdcard");
//            ftpClient.changeWorkingDirectory("/");

//            creatFtpFile("ftpupload");
            boolean isCreat = ftpClient.makeDirectory("/upload");
            DebugLog.d(LOG + "isCreat 不存在创建 " + isCreat + "  isConnected  " + ftpClient.isConnected());
            ftpClient.changeWorkingDirectory("/upload");


            // 设置上传文件需要的一些基本信息
            ftpClient.setBufferSize(1024);
//            ftpClient.setControlEncoding("UTF-8");
            ftpClient.enterLocalPassiveMode();

//            ftpClient.enterRemotePassiveMode();

            ftpClient.setFileType(FTP.BINARY_FILE_TYPE);

            // 文件上传吧～
            FileInputStream fileInputStream = new FileInputStream(FilePath);
            ftpClient.storeFile(FileName, fileInputStream);

            // 关闭文件流
            fileInputStream.close();
            DebugLog.d(LOG + "上传成功");

            // 退出登陆FTP，关闭ftpCLient的连接
//            ftpClient.logout();
//            ftpClient.disconnect();

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return false;
        }
        return true;
    }

//    public void creatFtpFile(String ftppath) throws IOException {
//        //将文件目录按路径分隔符读取，然后分别创建
//        String[] ftppaths = ftppath.split("/");
//
//        for(int i=0; i<ftppaths.length; i++) {
//        if(!ftpClient.changeWorkingDirectory(ftppaths[i])){
//            boolean isCreat = ftpClient.makeDirectory(ftppaths[i]);
//            DebugLog.d(LOG+ "isCreat 不存在创建 "+isCreat+"  isConnected  "+ ftpClient.isConnected());
//            ftpClient.changeWorkingDirectory(ftppaths[i]);
//        }else{
//            DebugLog.d(LOG+"  已存在 ");
//        }
//
//        }
//    }

    /**
     * 下载文件
     *
     * @param FilePath 要存放的文件的路径
     * @param FileName 远程FTP服务器上的那个文件的名字
     * @return true为成功，false为失败
     */
    public boolean downLoadFile(String FilePath, String FileName) {

        if (!ftpClient.isConnected()) {
            return false;
        }
        if (!initFTPSetting(FTPUrl, FTPPort, UserName, UserPassword)) {
            return false;
        }

        try {
            // 转到指定下载目录
            ftpClient.changeWorkingDirectory("/Download/123.avi");

            // 列出该目录下所有文件
            FTPFile[] files = ftpClient.listFiles();

            // 遍历所有文件，找到指定的文件
            for (FTPFile file : files) {
                if (file.getName().equals(FileName)) {
                    // 根据绝对路径初始化文件
                    File localFile = new File(FilePath);

                    // 输出流
                    OutputStream outputStream = new FileOutputStream(localFile);

                    // 下载文件
                    ftpClient.retrieveFile(file.getName(), outputStream);

                    // 关闭流
                    outputStream.close();
                    DebugLog.d(LOG + "下载成功");
                }
            }

            // 退出登陆FTP，关闭ftpCLient的连接
            ftpClient.logout();
            ftpClient.disconnect();

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return true;
    }

    /**
     * 下载单个文件.
     *            FTP目录
     * @return true下载成功, false下载失败
     * @throws IOException
     */
    public void downloadSingle() throws IOException {

        FTPFile file = ftpClient.mdtmFile("123.avi");
        File localFile = new File(Environment.getExternalStorageDirectory()+"/FTP_DOWNLOAD",file.getName());
        // 创建输出流
        OutputStream outputStream = new FileOutputStream(localFile);
        // 下载单个文件
        ftpClient.retrieveFile(localFile.getName(), outputStream);
        // 关闭文件流
        outputStream.close();
    }

    /**
     * 列出FTP下所有文件.
     *
     * @param remotePath
     *            服务器目录
     * @return FTPFile集合
     * @throws IOException
     */
    public List<FTPFile> listFiles(String remotePath) throws IOException {
        List<FTPFile> list  = new ArrayList<>();
        if (ftpClient != null) {
            // 获取文件
            try {
                FTPFile[] files = ftpClient.listFiles(remotePath);
                if (files != null && files.length > 0) {
                    // 遍历并且添加到集合
                    for (FTPFile file : files) {
                        list.add(file);
                    }
                }
            } catch (Exception e) {

            }
        }
        return list;
    }

}
